adapter->netdev = netdev;
adapter->pdev = pdev;
adapter->hw.back = adapter;
+ spin_lock_init(&adapter->tx_lock);
mmio_start = pci_resource_start(pdev, BAR_0);
mmio_len = pci_resource_len(pdev, BAR_0);
count++;
if(E1000_DESC_UNUSED(&adapter->tx_ring) < count) {
+ printk("%s: BUG! Ring full with queue awake!\n", netdev->name);
netif_stop_queue(netdev);
return 1;
}
if(adapter->vlgrp && vlan_tx_tag_present(skb)) {
tx_flags |= E1000_TX_FLAGS_VLAN;
- tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
+ tx_flags |= (vlan_tx_tag_get(skb)<<E1000_TX_FLAGS_VLAN_SHIFT);
}
+ spin_lock_irq(&adapter->tx_lock);
+
count = e1000_tx_map(adapter, skb);
e1000_tx_queue(adapter, count, tx_flags);
netdev->trans_start = jiffies;
+ if(E1000_DESC_UNUSED(&adapter->tx_ring) < (MAX_SKB_FRAGS + 1))
+ netif_stop_queue(netdev);
+
+ spin_unlock_irq(&adapter->tx_lock);
+
return 0;
}
struct pci_dev *pdev = adapter->pdev;
struct e1000_tx_desc *tx_desc;
int i;
+ unsigned long flags;
+
+ spin_lock_irqsave(&adapter->tx_lock, flags);
i = tx_ring->next_to_clean;
tx_desc = E1000_TX_DESC(*tx_ring, i);
netif_wake_queue(netdev);
}
+
+ spin_unlock_irqrestore(&adapter->tx_lock, flags);
}
/**